﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;

namespace TreinamentoCRUD3
{
    public class Dados
    {
        ///String Conexão
        ///Serve para acessar o banco.
        public string strConexao = ConfigurationManager.ConnectionStrings["ConnectionStrings"].ConnectionString;
        
        /// classe usada na consulta
        public class Clientes 
        {
            public int Codigo {get; set;}
            public string Nome {get; set;}
            public long CPF { get; set; }
        }

        #region Comandos SQL
        public const string strInsert = "INSERT INTO clientes VALUES (@cliNome, @cliCPF)";
        public const string strSelect = "SELECT * FROM clientes";
        public const string strSelectByParameter = "SELECT * FROM clientes WHERE cliNome LIKE + '%' + @cliNome + '%' OR cliCPF LIKE + '%' + @cliCPF + '%'";
        public const string strUpdate = "UPDATE clientes SET cliNome=@cliNome, cliCPF=@cliCPF WHERE cliCod=@cliCod";
        public const string strDelete = "DELETE FROM clientes WHERE cliCod=@cliCod";
        #endregion

        #region Métodos SQL

        ///Método criado para inserir dados no banco.
        ///Recebe dois parâmentros.
        public void Inserir(string pCliNome, long pCliCPF) 
        {
            ///inicia a conexão com o banco de dados
            using (SqlConnection objConexao = new SqlConnection(strConexao)) 
            {
                ///Executa o comando para inserir juntamente com a conexão
                using (SqlCommand objComando = new SqlCommand(strInsert, objConexao))
                {
                    ///Juntamente com os parametros, passa os respectivos valores
                    objComando.Parameters.AddWithValue("@cliNome", pCliNome);
                    objComando.Parameters.AddWithValue("@cliCPF", pCliCPF);
                    ///Abre a conexão
                    objConexao.Open();
                    ///Executa o comando de insert
                    objComando.ExecuteNonQuery();
                    ///Fecha a conexão
                    objConexao.Close();
                }///Fim Using 'SqlCommand'
            }///Fim Using 'SqlConnection'
        }///Fim método Inserir


        ///Método utlizado para atualizar os dados no banco.
        ///Aceita três parâmetros.
        public void Atualizar(int pCliCod, string pCliNome, long pCliCPF)
        {
            ///Instancia uma conexão com o banco.
            using (SqlConnection objConexao = new SqlConnection(strConexao))
            {
                ///Instancia um comando SQL, passando dois parametros.
                using (SqlCommand objComando = new SqlCommand(strUpdate, objConexao))
                {
                    ///Juntamente com os parametros e seus repectivos valores
                    objComando.Parameters.AddWithValue("@cliCod", pCliCod);
                    objComando.Parameters.AddWithValue("@cliNome", pCliNome);
                    objComando.Parameters.AddWithValue("@cliCPF", pCliCPF);
                    ///Abre a conexão
                    objConexao.Open();
                    ///Executa o comando SQL
                    objComando.ExecuteNonQuery();
                    ///Fecha a conexão
                    objConexao.Close();
                }
            }
        }///Fim método atualizar

        public void Deletar(int pCliCod)
        {
            using (SqlConnection objConexao = new SqlConnection(strConexao))
            {
                using (SqlCommand objComando = new SqlCommand(strDelete, objConexao))
                {
                    objComando.Parameters.AddWithValue("@cliCod", pCliCod);

                    objConexao.Open();
                    objComando.ExecuteNonQuery();
                    objConexao.Close();
                }
            }
        }

        ///Declara o método CONSULTAR do tipo List<Clientes>
        public List<Clientes> Consultar() 
        {
            ///Cria uma lista onde recebera os dados do banco.
            List<Clientes> lstClientes = new List<Clientes>();
            ///Usa a conexão com o banco.
             using (SqlConnection objConexao = new SqlConnection(strConexao))
             {
                 ///Usa o comando sql de busca juntamente com a conexão.
                using (SqlCommand objComando = new SqlCommand(strSelect, objConexao))
                {
                    ///Abre a conexão.
                    objConexao.Open();
                    ///Cria um objeto DataReader necessário para consulta
                    ///em banco de dados.
                    SqlDataReader objDataReader = objComando.ExecuteReader();
                    ///Verifica se tem registros no objeto data reader
                    if(objDataReader.HasRows)
                    {
                        ///Enquanto tiver dados no banco...
                        while (objDataReader.Read()) 
                        {
                            ///Cria um objeto Cliente
                            Clientes objClientes = new Clientes();
                            ///Adiciona as variaveis  os dados vindos do banco.
                            objClientes.Codigo = int.Parse(objDataReader["cliCod"].ToString());
                            objClientes.Nome = objDataReader["cliNome"].ToString();
                            objClientes.CPF = long.Parse(objDataReader["cliCPF"].ToString());
                            ///Adiciona a lista o objeto Clientes
                            lstClientes.Add(objClientes);
                        }///Fim do laço.
                    }///Fim do IF
                    ///Fecha a conexão
                    objConexao.Close();
                }///Fim 'Using'
             }///Fim 'Using'
            ///Retorna a lista com dados.
             return lstClientes;
        }///Fim método.

        public List<Clientes> consultarPorParametro(string pPesquisa) 
        {
            List<Clientes> lstClientes = new List<Clientes>();
            using (SqlConnection objConexao = new SqlConnection(strConexao)) 
            {
                using (SqlCommand objComando = new SqlCommand(strSelectByParameter,objConexao)) 
                {
                    objComando.Parameters.AddWithValue("@cliNome", pPesquisa);
                    objComando.Parameters.AddWithValue("@cliCPF", pPesquisa);
                    

                    objConexao.Open();


                    SqlDataReader objDataReader = objComando.ExecuteReader();

                    if (objDataReader.HasRows) 
                    {
                        while (objDataReader.Read()) 
                        {
                            Clientes objCliente = new Clientes();
                            objCliente.Codigo = int.Parse(objDataReader["cliCod"].ToString());
                            objCliente.Nome = objDataReader["cliNome"].ToString();
                            objCliente.CPF = long.Parse(objDataReader["cliCPF"].ToString());

                            lstClientes.Add(objCliente);
                        }
                    }
                    objConexao.Close();
                }
            }
            return lstClientes;
        }


        #endregion

    }
}
